#ifndef ___leer_archivo_config
#define ___leer_archivo_config 1


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct datos_config {
    unsigned int ip0;
    unsigned int ip1;
    unsigned int ip2;
    unsigned int ip3;
    unsigned int puerto;
    unsigned int cantConex;
    unsigned int tamCache;
    char * path;
};

//PROTOTIPO
struct datos_config ___leer_arch_config(char *);
struct datos_config leer_archivo_config_completo(void);

//Lee datos de archivo de configuracion del PFS pasandole el parametro que deseo obtener
struct datos_config ___leer_arch_config(char * parametro) {

    FILE * ptr;
    char * cadena;
    unsigned int i, j;
    unsigned int elem0, elem1, elem2, elem3;
    struct datos_config arch;

    ptr = fopen("config_pfs.txt", "r");

    //IP
    if( (strcmp(parametro, "ip") == 0) ) {

        rewind(ptr);
        for (i = 0; i < 3 ; i ++) {
            cadena[i] = getc(ptr);
        }

        cadena[3] = '\0';

        if ((strcmp(cadena, "ip=")) == 0 ) {

            for (j = 0; j < 4; j ++)  {
                cadena[j] = getc(ptr);

                if (cadena[j] == '.') {
                    cadena[j] = '\0';
                    elem0 = atoi(cadena);
                        if ( (elem0 <= 255) && (elem0 >= 0) ) 
                            arch.ip0 = elem0;

                        break;
                }
            }
        }

        for (j = 0; j < 4; j ++)  {
            cadena[j] = getc(ptr);

            if (cadena[j] == '.') {
                cadena[j] = '\0';
                elem1 = atoi(cadena);
                    if ( (elem1 <= 255) && (elem1 >= 0) )
                        arch.ip1 = elem1;
                        
                    break;
            }
        }


        for (j = 0; j < 4; j++)  {
            cadena[j] = getc(ptr);

            if (cadena[j] == '.') {
                cadena[j] = '\0';
                elem2 = atoi(cadena);
                    if ( (elem2 <= 255) && (elem2 >= 0) ) 
                        arch.ip2 = elem2;

                    break;
            }
        }


        for (j = 0; j < 4; j++)  {
            cadena[j] = getc(ptr);

            if (cadena[j] == '\n') {
                cadena[j] = '\0';
                elem3 = atoi(cadena);
                    if ( (elem3 <= 255) && (elem3 >= 0) ) 
                        arch.ip3 = elem3;

                    break;
            }
        }
    }


    //Puerto
    if ( (strcmp(parametro, "puerto") == 0) ) {

        rewind(ptr);

        cadena[0] = getc(ptr);

        for (i = 1; ( cadena[i] = (getc(ptr) != '\n' )) ; i++) {
        }

        for (i = 0; i < 7; i++) {
            cadena[i] = getc(ptr);
        }

        cadena[7] = '\0';

        if ( (strcmp(cadena, "puerto=")) == 0 )  {

            for (j = 0; j < 5; j ++) {

                cadena[j] = getc(ptr);

                if (cadena[j] == '\n')
                    cadena[j] = '\0';
                }
        }

        arch.puerto = atoi(cadena);
    }


    getc(ptr);

    //Maxima cantidad de conexiones
    if ( (strcmp(parametro, "maxCantConex") == 0) ) {

        rewind(ptr);

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++)  {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for (i = 0; i < 11; i++)
            cadena[i] = getc(ptr);

        cadena[11] = '\0';

        if ( (strcmp(cadena, "conexiones=")) == 0) {

            for (j = 0; j < 2; j ++) {

                cadena[j] = getc(ptr);

                if (cadena[j] == '\n')
                    cadena[j] = '\0';

            }

        arch.cantConex = atoi(cadena);
        }
    }

    getc(ptr);

    //TamaÃƒÂ±o de la cache
    if ( (strcmp(parametro, "cache") == 0) ) {

        rewind(ptr);

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++)  {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for (i = 0; i < 10; i++)
            cadena[i] = getc(ptr);

        cadena[10] = '\0';

        if ( (strcmp(cadena, "cache(kb)=")) == 0) {

            for(i = 0; i < 2 ; i++) {
            cadena[i] = getc(ptr);
            }

            i = atoi(cadena);

                if ( (i == 0) || (i == 4) || (i == 8) || (i == 16) || (i == 32)) {
                    arch.tamCache = i;
                } else
                    arch.tamCache = 0; //si la cache ingresada no es correcta devuelvo 300

        }
    }


    if ( (strcmp(parametro, "path") == 0) ) {

        rewind(ptr);
        
        cadena = malloc(200);

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++)  {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for(i = 0; ( cadena[i] = (getc(ptr) != '\n') ); i++) {
        }

        for (i = 0; i < 5; i++)
            cadena[i] = getc(ptr);

        cadena[5] = '\0';

        if ( (strcmp(cadena, "path=")) == 0) {

            for(i = 0; feof(ptr) == 0 ; i++) {
            cadena[i] = getc(ptr);
            }

            cadena[i] = '\n';
            arch.path = cadena;

        }
    }


       fclose(ptr);
    return arch;
}

struct datos_config leer_archivo_config_completo (void) {
  struct datos_config actual, total;
  total = ___leer_arch_config("ip");
  actual = ___leer_arch_config("puerto");
  total.puerto = actual.puerto;
  actual = ___leer_arch_config("maxCantConex");
  total.cantConex = actual.cantConex;
  actual = ___leer_arch_config("cache");
  total.tamCache = actual.tamCache;
  actual = ___leer_arch_config("path");
  total.path = actual.path;
  return total;
}

#endif

